home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2006 December / PCWDEC06.iso / Software / Trial / Paint Shop Pro XI / Data1.cab / subprocess.py.0160FC08_F3D9_4869_9D41_C611C16F42D5 < prev    next >
Encoding:
Text File  |  2005-06-08  |  41.1 KB  |  1,166 lines

  1. # subprocess - Subprocesses with accessible I/O streams
  2. #
  3. # For more information about this module, see PEP 324.
  4. #
  5. # Copyright (c) 2003-2004 by Peter Astrand <astrand@lysator.liu.se>
  6. #
  7. # By obtaining, using, and/or copying this software and/or its
  8. # associated documentation, you agree that you have read, understood,
  9. # and will comply with the following terms and conditions:
  10. #
  11. # Permission to use, copy, modify, and distribute this software and
  12. # its associated documentation for any purpose and without fee is
  13. # hereby granted, provided that the above copyright notice appears in
  14. # all copies, and that both that copyright notice and this permission
  15. # notice appear in supporting documentation, and that the name of the
  16. # author not be used in advertising or publicity pertaining to
  17. # distribution of the software without specific, written prior
  18. # permission.
  19. #
  20. # THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  21. # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
  22. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  23. # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  24. # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  25. # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  26. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  27.  
  28. r"""subprocess - Subprocesses with accessible I/O streams
  29.  
  30. This module allows you to spawn processes, connect to their
  31. input/output/error pipes, and obtain their return codes.  This module
  32. intends to replace several other, older modules and functions, like:
  33.  
  34. os.system
  35. os.spawn*
  36. os.popen*
  37. popen2.*
  38. commands.*
  39.  
  40. Information about how the subprocess module can be used to replace these
  41. modules and functions can be found below.
  42.  
  43.  
  44.  
  45. Using the subprocess module
  46. ===========================
  47. This module defines one class called Popen:
  48.  
  49. class Popen(args, bufsize=0, executable=None,
  50.             stdin=None, stdout=None, stderr=None,
  51.             preexec_fn=None, close_fds=False, shell=False,
  52.             cwd=None, env=None, universal_newlines=False,
  53.             startupinfo=None, creationflags=0):
  54.  
  55.  
  56. Arguments are:
  57.  
  58. args should be a string, or a sequence of program arguments.  The
  59. program to execute is normally the first item in the args sequence or
  60. string, but can be explicitly set by using the executable argument.
  61.  
  62. On UNIX, with shell=False (default): In this case, the Popen class
  63. uses os.execvp() to execute the child program.  args should normally
  64. be a sequence.  A string will be treated as a sequence with the string
  65. as the only item (the program to execute).
  66.  
  67. On UNIX, with shell=True: If args is a string, it specifies the
  68. command string to execute through the shell.  If args is a sequence,
  69. the first item specifies the command string, and any additional items
  70. will be treated as additional shell arguments.
  71.  
  72. On Windows: the Popen class uses CreateProcess() to execute the child
  73. program, which operates on strings.  If args is a sequence, it will be
  74. converted to a string using the list2cmdline method.  Please note that
  75. not all MS Windows applications interpret the command line the same
  76. way: The list2cmdline is designed for applications using the same
  77. rules as the MS C runtime.
  78.  
  79. bufsize, if given, has the same meaning as the corresponding argument
  80. to the built-in open() function: 0 means unbuffered, 1 means line
  81. buffered, any other positive value means use a buffer of
  82. (approximately) that size.  A negative bufsize means to use the system
  83. default, which usually means fully buffered.  The default value for
  84. bufsize is 0 (unbuffered).
  85.  
  86. stdin, stdout and stderr specify the executed programs' standard
  87. input, standard output and standard error file handles, respectively.
  88. Valid values are PIPE, an existing file descriptor (a positive
  89. integer), an existing file object, and None.  PIPE indicates that a
  90. new pipe to the child should be created.  With None, no redirection
  91. will occur; the child's file handles will be inherited from the
  92. parent.  Additionally, stderr can be STDOUT, which indicates that the
  93. stderr data from the applications should be captured into the same
  94. file handle as for stdout.
  95.  
  96. If preexec_fn is set to a callable object, this object will be called
  97. in the child process just before the child is executed.
  98.  
  99. If close_fds is true, all file descriptors except 0, 1 and 2 will be
  100. closed before the child process is executed.
  101.  
  102. if shell is true, the specified command will be executed through the
  103. shell.
  104.  
  105. If cwd is not None, the current directory will be changed to cwd
  106. before the child is executed.
  107.  
  108. If env is not None, it defines the environment variables for the new
  109. process.
  110.  
  111. If universal_newlines is true, the file objects stdout and stderr are
  112. opened as a text files, but lines may be terminated by any of '\n',
  113. the Unix end-of-line convention, '\r', the Macintosh convention or
  114. '\r\n', the Windows convention.  All of these external representations
  115. are seen as '\n' by the Python program.  Note: This feature is only
  116. available if Python is built with universal newline support (the
  117. default).  Also, the newlines attribute of the file objects stdout,
  118. stdin and stderr are not updated by the communicate() method.
  119.  
  120. The startupinfo and creationflags, if given, will be passed to the
  121. underlying CreateProcess() function.  They can specify things such as
  122. appearance of the main window and priority for the new process.
  123. (Windows only)
  124.  
  125.  
  126. This module also defines two shortcut functions:
  127.  
  128. call(*args, **kwargs):
  129.     Run command with arguments.  Wait for command to complete, then
  130.     return the returncode attribute.
  131.  
  132.     The arguments are the same as for the Popen constructor.  Example:
  133.  
  134.     retcode = call(["ls", "-l"])
  135.  
  136.  
  137. Exceptions
  138. ----------
  139. Exceptions raised in the child process, before the new program has
  140. started to execute, will be re-raised in the parent.  Additionally,
  141. the exception object will have one extra attribute called
  142. 'child_traceback', which is a string containing traceback information
  143. from the childs point of view.
  144.  
  145. The most common exception raised is OSError.  This occurs, for
  146. example, when trying to execute a non-existent file.  Applications
  147. should prepare for OSErrors.
  148.  
  149. A ValueError will be raised if Popen is called with invalid arguments.
  150.  
  151.  
  152. Security
  153. --------
  154. Unlike some other popen functions, this implementation will never call
  155. /bin/sh implicitly.  This means that all characters, including shell
  156. metacharacters, can safely be passed to child processes.
  157.  
  158.  
  159. Popen objects
  160. =============
  161. Instances of the Popen class have the following methods:
  162.  
  163. poll()
  164.     Check if child process has terminated.  Returns returncode
  165.     attribute.
  166.  
  167. wait()
  168.     Wait for child process to terminate.  Returns returncode attribute.
  169.  
  170. communicate(input=None)
  171.     Interact with process: Send data to stdin.  Read data from stdout
  172.     and stderr, until end-of-file is reached.  Wait for process to
  173.     terminate.  The optional stdin argument should be a string to be
  174.     sent to the child process, or None, if no data should be sent to
  175.     the child.
  176.  
  177.     communicate() returns a tuple (stdout, stderr).
  178.  
  179.     Note: The data read is buffered in memory, so do not use this
  180.     method if the data size is large or unlimited.
  181.  
  182. The following attributes are also available:
  183.  
  184. stdin
  185.     If the stdin argument is PIPE, this attribute is a file object
  186.     that provides input to the child process.  Otherwise, it is None.
  187.  
  188. stdout
  189.     If the stdout argument is PIPE, this attribute is a file object
  190.     that provides output from the child process.  Otherwise, it is
  191.     None.
  192.  
  193. stderr
  194.     If the stderr argument is PIPE, this attribute is file object that
  195.     provides error output from the child process.  Otherwise, it is
  196.     None.
  197.  
  198. pid
  199.     The process ID of the child process.
  200.  
  201. returncode
  202.     The child return code.  A None value indicates that the process
  203.     hasn't terminated yet.  A negative value -N indicates that the
  204.     child was terminated by signal N (UNIX only).
  205.  
  206.  
  207. Replacing older functions with the subprocess module
  208. ====================================================
  209. In this section, "a ==> b" means that b can be used as a replacement
  210. for a.
  211.  
  212. Note: All functions in this section fail (more or less) silently if
  213. the executed program cannot be found; this module raises an OSError
  214. exception.
  215.  
  216. In the following examples, we assume that the subprocess module is
  217. imported with "from subprocess import *".
  218.  
  219.  
  220. Replacing /bin/sh shell backquote
  221. ---------------------------------
  222. output=`mycmd myarg`
  223. ==>
  224. output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
  225.  
  226.  
  227. Replacing shell pipe line
  228. -------------------------
  229. output=`dmesg | grep hda`
  230. ==>
  231. p1 = Popen(["dmesg"], stdout=PIPE)
  232. p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
  233. output = p2.communicate()[0]
  234.  
  235.  
  236. Replacing os.system()
  237. ---------------------
  238. sts = os.system("mycmd" + " myarg")
  239. ==>
  240. p = Popen("mycmd" + " myarg", shell=True)
  241. sts = os.waitpid(p.pid, 0)
  242.  
  243. Note:
  244.  
  245. * Calling the program through the shell is usually not required.
  246.  
  247. * It's easier to look at the returncode attribute than the
  248.   exitstatus.
  249.  
  250. A more real-world example would look like this:
  251.  
  252. try:
  253.     retcode = call("mycmd" + " myarg", shell=True)
  254.     if retcode < 0:
  255.         print >>sys.stderr, "Child was terminated by signal", -retcode
  256.     else:
  257.         print >>sys.stderr, "Child returned", retcode
  258. except OSError, e:
  259.     print >>sys.stderr, "Execution failed:", e
  260.  
  261.  
  262. Replacing os.spawn*
  263. -------------------
  264. P_NOWAIT example:
  265.  
  266. pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
  267. ==>
  268. pid = Popen(["/bin/mycmd", "myarg"]).pid
  269.  
  270.  
  271. P_WAIT example:
  272.  
  273. retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
  274. ==>
  275. retcode = call(["/bin/mycmd", "myarg"])
  276.  
  277.  
  278. Vector example:
  279.  
  280. os.spawnvp(os.P_NOWAIT, path, args)
  281. ==>
  282. Popen([path] + args[1:])
  283.  
  284.  
  285. Environment example:
  286.  
  287. os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
  288. ==>
  289. Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
  290.  
  291.  
  292. Replacing os.popen*
  293. -------------------
  294. pipe = os.popen(cmd, mode='r', bufsize)
  295. ==>
  296. pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
  297.  
  298. pipe = os.popen(cmd, mode='w', bufsize)
  299. ==>
  300. pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
  301.  
  302.  
  303. (child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
  304. ==>
  305. p = Popen(cmd, shell=True, bufsize=bufsize,
  306.           stdin=PIPE, stdout=PIPE, close_fds=True)
  307. (child_stdin, child_stdout) = (p.stdin, p.stdout)
  308.  
  309.  
  310. (child_stdin,
  311.  child_stdout,
  312.  child_stderr) = os.popen3(cmd, mode, bufsize)
  313. ==>
  314. p = Popen(cmd, shell=True, bufsize=bufsize,
  315.           stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
  316. (child_stdin,
  317.  child_stdout,
  318.  child_stderr) = (p.stdin, p.stdout, p.stderr)
  319.  
  320.  
  321. (child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
  322. ==>
  323. p = Popen(cmd, shell=True, bufsize=bufsize,
  324.           stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
  325. (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
  326.  
  327.  
  328. Replacing popen2.*
  329. ------------------
  330. Note: If the cmd argument to popen2 functions is a string, the command
  331. is executed through /bin/sh.  If it is a list, the command is directly
  332. executed.
  333.  
  334. (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
  335. ==>
  336. p = Popen(["somestring"], shell=True, bufsize=bufsize
  337.           stdin=PIPE, stdout=PIPE, close_fds=True)
  338. (child_stdout, child_stdin) = (p.stdout, p.stdin)
  339.  
  340.  
  341. (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
  342. ==>
  343. p = Popen(["mycmd", "myarg"], bufsize=bufsize,
  344.           stdin=PIPE, stdout=PIPE, close_fds=True)
  345. (child_stdout, child_stdin) = (p.stdout, p.stdin)
  346.  
  347. The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
  348. except that:
  349.  
  350. * subprocess.Popen raises an exception if the execution fails
  351. * the capturestderr argument is replaced with the stderr argument.
  352. * stdin=PIPE and stdout=PIPE must be specified.
  353. * popen2 closes all filedescriptors by default, but you have to specify
  354.   close_fds=True with subprocess.Popen.
  355.  
  356.  
  357. """
  358.  
  359. import sys
  360. mswindows = (sys.platform == "win32")
  361.  
  362. import os
  363. import types
  364. import traceback
  365.  
  366. if mswindows:
  367.     import threading
  368.     import msvcrt
  369.     if 0: # <-- change this to use pywin32 instead of the _subprocess driver
  370.         import pywintypes
  371.         from win32api import GetStdHandle, STD_INPUT_HANDLE, \
  372.                              STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
  373.         from win32api import GetCurrentProcess, DuplicateHandle, \
  374.                              GetModuleFileName, GetVersion
  375.         from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
  376.         from win32pipe import CreatePipe
  377.         from win32process import CreateProcess, STARTUPINFO, \
  378.                                  GetExitCodeProcess, STARTF_USESTDHANDLES, \
  379.                                  STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
  380.         from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
  381.     else:
  382.         from _subprocess import *
  383.         class STARTUPINFO:
  384.             dwFlags = 0
  385.             hStdInput = None
  386.             hStdOutput = None
  387.             hStdError = None
  388.         class pywintypes:
  389.             error = IOError
  390. else:
  391.     import select
  392.     import errno
  393.     import fcntl
  394.     import pickle
  395.  
  396. __all__ = ["Popen", "PIPE", "STDOUT", "call"]
  397.  
  398. try:
  399.     MAXFD = os.sysconf("SC_OPEN_MAX")
  400. except:
  401.     MAXFD = 256
  402.  
  403. # True/False does not exist on 2.2.0
  404. try:
  405.     False
  406. except NameError:
  407.     False = 0
  408.     True = 1
  409.  
  410. _active = []
  411.  
  412. def _cleanup():
  413.     for inst in _active[:]:
  414.         inst.poll()
  415.  
  416. PIPE = -1
  417. STDOUT = -2
  418.  
  419.  
  420. def call(*args, **kwargs):
  421.     """Run command with arguments.  Wait for command to complete, then
  422.     return the returncode attribute.
  423.  
  424.     The arguments are the same as for the Popen constructor.  Example:
  425.  
  426.     retcode = call(["ls", "-l"])
  427.     """
  428.     return Popen(*args, **kwargs).wait()
  429.  
  430.  
  431. def list2cmdline(seq):
  432.     """
  433.     Translate a sequence of arguments into a command line
  434.     string, using the same rules as the MS C runtime:
  435.  
  436.     1) Arguments are delimited by white space, which is either a
  437.        space or a tab.
  438.  
  439.     2) A string surrounded by double quotation marks is
  440.        interpreted as a single argument, regardless of white space
  441.        contained within.  A quoted string can be embedded in an
  442.        argument.
  443.  
  444.     3) A double quotation mark preceded by a backslash is
  445.        interpreted as a literal double quotation mark.
  446.  
  447.     4) Backslashes are interpreted literally, unless they
  448.        immediately precede a double quotation mark.
  449.  
  450.     5) If backslashes immediately precede a double quotation mark,
  451.        every pair of backslashes is interpreted as a literal
  452.        backslash.  If the number of backslashes is odd, the last
  453.        backslash escapes the next double quotation mark as
  454.        described in rule 3.
  455.     """
  456.  
  457.     # See
  458.     # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
  459.     result = []
  460.     needquote = False
  461.     for arg in seq:
  462.         bs_buf = []
  463.  
  464.         # Add a space to separate this argument from the others
  465.         if result:
  466.             result.append(' ')
  467.  
  468.         needquote = (" " in arg) or ("\t" in arg)
  469.         if needquote:
  470.             result.append('"')
  471.  
  472.         for c in arg:
  473.             if c == '\\':
  474.                 # Don't know if we need to double yet.
  475.                 bs_buf.append(c)
  476.             elif c == '"':
  477.                 # Double backspaces.
  478.                 result.append('\\' * len(bs_buf)*2)
  479.                 bs_buf = []
  480.                 result.append('\\"')
  481.             else:
  482.                 # Normal char
  483.                 if bs_buf:
  484.                     result.extend(bs_buf)
  485.                     bs_buf = []
  486.                 result.append(c)
  487.  
  488.         # Add remaining backspaces, if any.
  489.         if bs_buf:
  490.             result.extend(bs_buf)
  491.  
  492.         if needquote:
  493.             result.extend(bs_buf)
  494.             result.append('"')
  495.  
  496.     return ''.join(result)
  497.  
  498.  
  499. class Popen(object):
  500.     def __init__(self, args, bufsize=0, executable=None,
  501.                  stdin=None, stdout=None, stderr=None,
  502.                  preexec_fn=None, close_fds=False, shell=False,
  503.                  cwd=None, env=None, universal_newlines=False,
  504.                  startupinfo=None, creationflags=0):
  505.         """Create new Popen instance."""
  506.         _cleanup()
  507.  
  508.         if not isinstance(bufsize, (int, long)):
  509.             raise TypeError("bufsize must be an integer")
  510.  
  511.         if mswindows:
  512.             if preexec_fn is not None:
  513.                 raise ValueError("preexec_fn is not supported on Windows "
  514.                                  "platforms")
  515.             if close_fds:
  516.                 raise ValueError("close_fds is not supported on Windows "
  517.                                  "platforms")
  518.         else:
  519.             # POSIX
  520.             if startupinfo is not None:
  521.                 raise ValueError("startupinfo is only supported on Windows "
  522.                                  "platforms")
  523.             if creationflags != 0:
  524.                 raise ValueError("creationflags is only supported on Windows "
  525.                                  "platforms")
  526.  
  527.         self.stdin = None
  528.         self.stdout = None
  529.         self.stderr = None
  530.         self.pid = None
  531.         self.returncode = None
  532.         self.universal_newlines = universal_newlines
  533.  
  534.         # Input and output objects. The general principle is like
  535.         # this:
  536.         #
  537.         # Parent                   Child
  538.         # ------                   -----
  539.         # p2cwrite   ---stdin--->  p2cread
  540.         # c2pread    <--stdout---  c2pwrite
  541.         # errread    <--stderr---  errwrite
  542.         #
  543.         # On POSIX, the child objects are file descriptors.  On
  544.         # Windows, these are Windows file handles.  The parent objects
  545.         # are file descriptors on both platforms.  The parent objects
  546.         # are None when not using PIPEs. The child objects are None
  547.         # when not redirecting.
  548.  
  549.         (p2cread, p2cwrite,
  550.          c2pread, c2pwrite,
  551.          errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  552.  
  553.         self._execute_child(args, executable, preexec_fn, close_fds,
  554.                             cwd, env, universal_newlines,
  555.                             startupinfo, creationflags, shell,
  556.                             p2cread, p2cwrite,
  557.                             c2pread, c2pwrite,
  558.                             errread, errwrite)
  559.  
  560.         if p2cwrite:
  561.             self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
  562.         if c2pread:
  563.             if universal_newlines:
  564.                 self.stdout = os.fdopen(c2pread, 'rU', bufsize)
  565.             else:
  566.                 self.stdout = os.fdopen(c2pread, 'rb', bufsize)
  567.         if errread:
  568.             if universal_newlines:
  569.                 self.stderr = os.fdopen(errread, 'rU', bufsize)
  570.             else:
  571.                 self.stderr = os.fdopen(errread, 'rb', bufsize)
  572.  
  573.         _active.append(self)
  574.  
  575.  
  576.     def _translate_newlines(self, data):
  577.         data = data.replace("\r\n", "\n")
  578.         data = data.replace("\r", "\n")
  579.         return data
  580.  
  581.  
  582.     if mswindows:
  583.         #
  584.         # Windows methods
  585.         #
  586.         def _get_handles(self, stdin, stdout, stderr):
  587.             """Construct and return tupel with IO objects:
  588.             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
  589.             """
  590.             if stdin == None and stdout == None and stderr == None:
  591.                 return (None, None, None, None, None, None)
  592.  
  593.             p2cread, p2cwrite = None, None
  594.             c2pread, c2pwrite = None, None
  595.             errread, errwrite = None, None
  596.  
  597.             if stdin == None:
  598.                 p2cread = GetStdHandle(STD_INPUT_HANDLE)
  599.             elif stdin == PIPE:
  600.                 p2cread, p2cwrite = CreatePipe(None, 0)
  601.                 # Detach and turn into fd
  602.                 p2cwrite = p2cwrite.Detach()
  603.                 p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
  604.             elif type(stdin) == types.IntType:
  605.                 p2cread = msvcrt.get_osfhandle(stdin)
  606.             else:
  607.                 # Assuming file-like object
  608.                 p2cread = msvcrt.get_osfhandle(stdin.fileno())
  609.             p2cread = self._make_inheritable(p2cread)
  610.  
  611.             if stdout == None:
  612.                 c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
  613.             elif stdout == PIPE:
  614.                 c2pread, c2pwrite = CreatePipe(None, 0)
  615.                 # Detach and turn into fd
  616.                 c2pread = c2pread.Detach()
  617.                 c2pread = msvcrt.open_osfhandle(c2pread, 0)
  618.             elif type(stdout) == types.IntType:
  619.                 c2pwrite = msvcrt.get_osfhandle(stdout)
  620.             else:
  621.                 # Assuming file-like object
  622.                 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
  623.             c2pwrite = self._make_inheritable(c2pwrite)
  624.  
  625.             if stderr == None:
  626.                 errwrite = GetStdHandle(STD_ERROR_HANDLE)
  627.             elif stderr == PIPE:
  628.                 errread, errwrite = CreatePipe(None, 0)
  629.                 # Detach and turn into fd
  630.                 errread = errread.Detach()
  631.                 errread = msvcrt.open_osfhandle(errread, 0)
  632.             elif stderr == STDOUT:
  633.                 errwrite = c2pwrite
  634.             elif type(stderr) == types.IntType:
  635.                 errwrite = msvcrt.get_osfhandle(stderr)
  636.             else:
  637.                 # Assuming file-like object
  638.                 errwrite = msvcrt.get_osfhandle(stderr.fileno())
  639.             errwrite = self._make_inheritable(errwrite)
  640.  
  641.             return (p2cread, p2cwrite,
  642.                     c2pread, c2pwrite,
  643.                     errread, errwrite)
  644.  
  645.  
  646.         def _make_inheritable(self, handle):
  647.             """Return a duplicate of handle, which is inheritable"""
  648.             return DuplicateHandle(GetCurrentProcess(), handle,
  649.                                    GetCurrentProcess(), 0, 1,
  650.                                    DUPLICATE_SAME_ACCESS)
  651.  
  652.  
  653.         def _find_w9xpopen(self):
  654.             """Find and return absolut path to w9xpopen.exe"""
  655.             w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
  656.                                     "w9xpopen.exe")
  657.             if not os.path.exists(w9xpopen):
  658.                 # Eeek - file-not-found - possibly an embedding
  659.                 # situation - see if we can locate it in sys.exec_prefix
  660.                 w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
  661.                                         "w9xpopen.exe")
  662.                 if not os.path.exists(w9xpopen):
  663.                     raise RuntimeError("Cannot locate w9xpopen.exe, which is "
  664.                                        "needed for Popen to work with your "
  665.                                        "shell or platform.")
  666.             return w9xpopen
  667.  
  668.  
  669.         def _execute_child(self, args, executable, preexec_fn, close_fds,
  670.                            cwd, env, universal_newlines,
  671.                            startupinfo, creationflags, shell,
  672.                            p2cread, p2cwrite,
  673.                            c2pread, c2pwrite,
  674.                            errread, errwrite):
  675.             """Execute program (MS Windows version)"""
  676.  
  677.             if not isinstance(args, types.StringTypes):
  678.                 args = list2cmdline(args)
  679.  
  680.             # Process startup details
  681.             default_startupinfo = STARTUPINFO()
  682.             if startupinfo == None:
  683.                 startupinfo = default_startupinfo
  684.             if not None in (p2cread, c2pwrite, errwrite):
  685.                 startupinfo.dwFlags |= STARTF_USESTDHANDLES
  686.                 startupinfo.hStdInput = p2cread
  687.                 startupinfo.hStdOutput = c2pwrite
  688.                 startupinfo.hStdError = errwrite
  689.  
  690.             if shell:
  691.                 default_startupinfo.dwFlags |= STARTF_USESHOWWINDOW
  692.                 default_startupinfo.wShowWindow = SW_HIDE
  693.                 comspec = os.environ.get("COMSPEC", "cmd.exe")
  694.                 args = comspec + " /c " + args
  695.                 if (GetVersion() >= 0x80000000L or
  696.                         os.path.basename(comspec).lower() == "command.com"):
  697.                     # Win9x, or using command.com on NT. We need to
  698.                     # use the w9xpopen intermediate program. For more
  699.                     # information, see KB Q150956
  700.                     # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
  701.                     w9xpopen = self._find_w9xpopen()
  702.                     args = '"%s" %s' % (w9xpopen, args)
  703.                     # Not passing CREATE_NEW_CONSOLE has been known to
  704.                     # cause random failures on win9x.  Specifically a
  705.                     # dialog: "Your program accessed mem currently in
  706.                     # use at xxx" and a hopeful warning about the
  707.                     # stability of your system.  Cost is Ctrl+C wont
  708.                     # kill children.
  709.                     creationflags |= CREATE_NEW_CONSOLE
  710.  
  711.             # Start the process
  712.             try:
  713.                 hp, ht, pid, tid = CreateProcess(executable, args,
  714.                                          # no special security
  715.                                          None, None,
  716.                                          # must inherit handles to pass std
  717.                                          # handles
  718.                                          1,
  719.                                          creationflags,
  720.                                          env,
  721.                                          cwd,
  722.                                          startupinfo)
  723.             except pywintypes.error, e:
  724.                 # Translate pywintypes.error to WindowsError, which is
  725.                 # a subclass of OSError.  FIXME: We should really
  726.                 # translate errno using _sys_errlist (or simliar), but
  727.                 # how can this be done from Python?
  728.                 raise WindowsError(*e.args)
  729.  
  730.             # Retain the process handle, but close the thread handle
  731.             self._handle = hp
  732.             self.pid = pid
  733.             ht.Close()
  734.  
  735.             # Child is launched. Close the parent's copy of those pipe
  736.             # handles that only the child should have open.  You need
  737.             # to make sure that no handles to the write end of the
  738.             # output pipe are maintained in this process or else the
  739.             # pipe will not close when the child process exits and the
  740.             # ReadFile will hang.
  741.             if p2cread != None:
  742.                 p2cread.Close()
  743.             if c2pwrite != None:
  744.                 c2pwrite.Close()
  745.             if errwrite != None:
  746.                 errwrite.Close()
  747.  
  748.  
  749.         def poll(self):
  750.             """Check if child process has terminated.  Returns returncode
  751.             attribute."""
  752.             if self.returncode == None:
  753.                 if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
  754.                     self.returncode = GetExitCodeProcess(self._handle)
  755.                     _active.remove(self)
  756.             return self.returncode
  757.  
  758.  
  759.         def wait(self):
  760.             """Wait for child process to terminate.  Returns returncode
  761.             attribute."""
  762.             if self.returncode == None:
  763.                 obj = WaitForSingleObject(self._handle, INFINITE)
  764.                 self.returncode = GetExitCodeProcess(self._handle)
  765.                 _active.remove(self)
  766.             return self.returncode
  767.  
  768.  
  769.         def _readerthread(self, fh, buffer):
  770.             buffer.append(fh.read())
  771.  
  772.  
  773.         def communicate(self, input=None):
  774.             """Interact with process: Send data to stdin.  Read data from
  775.             stdout and stderr, until end-of-file is reached.  Wait for
  776.             process to terminate.  The optional input argument should be a
  777.             string to be sent to the child process, or None, if no data
  778.             should be sent to the child.
  779.  
  780.             communicate() returns a tuple (stdout, stderr)."""
  781.             stdout = None # Return
  782.             stderr = None # Return
  783.  
  784.             if self.stdout:
  785.                 stdout = []
  786.                 stdout_thread = threading.Thread(target=self._readerthread,
  787.                                                  args=(self.stdout, stdout))
  788.                 stdout_thread.setDaemon(True)
  789.                 stdout_thread.start()
  790.             if self.stderr:
  791.                 stderr = []
  792.                 stderr_thread = threading.Thread(target=self._readerthread,
  793.                                                  args=(self.stderr, stderr))
  794.                 stderr_thread.setDaemon(True)
  795.                 stderr_thread.start()
  796.  
  797.             if self.stdin:
  798.                 if input != None:
  799.                     self.stdin.write(input)
  800.                 self.stdin.close()
  801.  
  802.             if self.stdout:
  803.                 stdout_thread.join()
  804.             if self.stderr:
  805.                 stderr_thread.join()
  806.  
  807.             # All data exchanged.  Translate lists into strings.
  808.             if stdout != None:
  809.                 stdout = stdout[0]
  810.             if stderr != None:
  811.                 stderr = stderr[0]
  812.  
  813.             # Translate newlines, if requested.  We cannot let the file
  814.             # object do the translation: It is based on stdio, which is
  815.             # impossible to combine with select (unless forcing no
  816.             # buffering).
  817.             if self.universal_newlines and hasattr(open, 'newlines'):
  818.                 if stdout:
  819.                     stdout = self._translate_newlines(stdout)
  820.                 if stderr:
  821.                     stderr = self._translate_newlines(stderr)
  822.  
  823.             self.wait()
  824.             return (stdout, stderr)
  825.  
  826.     else:
  827.         #
  828.         # POSIX methods
  829.         #
  830.         def _get_handles(self, stdin, stdout, stderr):
  831.             """Construct and return tupel with IO objects:
  832.             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
  833.             """
  834.             p2cread, p2cwrite = None, None
  835.             c2pread, c2pwrite = None, None
  836.             errread, errwrite = None, None
  837.  
  838.             if stdin == None:
  839.                 pass
  840.             elif stdin == PIPE:
  841.                 p2cread, p2cwrite = os.pipe()
  842.             elif type(stdin) == types.IntType:
  843.                 p2cread = stdin
  844.             else:
  845.                 # Assuming file-like object
  846.                 p2cread = stdin.fileno()
  847.  
  848.             if stdout == None:
  849.                 pass
  850.             elif stdout == PIPE:
  851.                 c2pread, c2pwrite = os.pipe()
  852.             elif type(stdout) == types.IntType:
  853.                 c2pwrite = stdout
  854.             else:
  855.                 # Assuming file-like object
  856.                 c2pwrite = stdout.fileno()
  857.  
  858.             if stderr == None:
  859.                 pass
  860.             elif stderr == PIPE:
  861.                 errread, errwrite = os.pipe()
  862.             elif stderr == STDOUT:
  863.                 errwrite = c2pwrite
  864.             elif type(stderr) == types.IntType:
  865.                 errwrite = stderr
  866.             else:
  867.                 # Assuming file-like object
  868.                 errwrite = stderr.fileno()
  869.  
  870.             return (p2cread, p2cwrite,
  871.                     c2pread, c2pwrite,
  872.                     errread, errwrite)
  873.  
  874.  
  875.         def _set_cloexec_flag(self, fd):
  876.             try:
  877.                 cloexec_flag = fcntl.FD_CLOEXEC
  878.             except AttributeError:
  879.                 cloexec_flag = 1
  880.  
  881.             old = fcntl.fcntl(fd, fcntl.F_GETFD)
  882.             fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
  883.  
  884.  
  885.         def _close_fds(self, but):
  886.             for i in range(3, MAXFD):
  887.                 if i == but:
  888.                     continue
  889.                 try:
  890.                     os.close(i)
  891.                 except:
  892.                     pass
  893.  
  894.  
  895.         def _execute_child(self, args, executable, preexec_fn, close_fds,
  896.                            cwd, env, universal_newlines,
  897.                            startupinfo, creationflags, shell,
  898.                            p2cread, p2cwrite,
  899.                            c2pread, c2pwrite,
  900.                            errread, errwrite):
  901.             """Execute program (POSIX version)"""
  902.  
  903.             if isinstance(args, types.StringTypes):
  904.                 args = [args]
  905.  
  906.             if shell:
  907.                 args = ["/bin/sh", "-c"] + args
  908.  
  909.             if executable == None:
  910.                 executable = args[0]
  911.  
  912.             # For transferring possible exec failure from child to parent
  913.             # The first char specifies the exception type: 0 means
  914.             # OSError, 1 means some other error.
  915.             errpipe_read, errpipe_write = os.pipe()
  916.             self._set_cloexec_flag(errpipe_write)
  917.  
  918.             self.pid = os.fork()
  919.             if self.pid == 0:
  920.                 # Child
  921.                 try:
  922.                     # Close parent's pipe ends
  923.                     if p2cwrite:
  924.                         os.close(p2cwrite)
  925.                     if c2pread:
  926.                         os.close(c2pread)
  927.                     if errread:
  928.                         os.close(errread)
  929.                     os.close(errpipe_read)
  930.  
  931.                     # Dup fds for child
  932.                     if p2cread:
  933.                         os.dup2(p2cread, 0)
  934.                     if c2pwrite:
  935.                         os.dup2(c2pwrite, 1)
  936.                     if errwrite:
  937.                         os.dup2(errwrite, 2)
  938.  
  939.                     # Close pipe fds.  Make sure we doesn't close the same
  940.                     # fd more than once.
  941.                     if p2cread:
  942.                         os.close(p2cread)
  943.                     if c2pwrite and c2pwrite not in (p2cread,):
  944.                         os.close(c2pwrite)
  945.                     if errwrite and errwrite not in (p2cread, c2pwrite):
  946.                         os.close(errwrite)
  947.  
  948.                     # Close all other fds, if asked for
  949.                     if close_fds:
  950.                         self._close_fds(but=errpipe_write)
  951.  
  952.                     if cwd != None:
  953.                         os.chdir(cwd)
  954.  
  955.                     if preexec_fn:
  956.                         apply(preexec_fn)
  957.  
  958.                     if env == None:
  959.                         os.execvp(executable, args)
  960.                     else:
  961.                         os.execvpe(executable, args, env)
  962.  
  963.                 except:
  964.                     exc_type, exc_value, tb = sys.exc_info()
  965.                     # Save the traceback and attach it to the exception object
  966.                     exc_lines = traceback.format_exception(exc_type,
  967.                                                            exc_value,
  968.                                                            tb)
  969.                     exc_value.child_traceback = ''.join(exc_lines)
  970.                     os.write(errpipe_write, pickle.dumps(exc_value))
  971.  
  972.                 # This exitcode won't be reported to applications, so it
  973.                 # really doesn't matter what we return.
  974.                 os._exit(255)
  975.  
  976.             # Parent
  977.             os.close(errpipe_write)
  978.             if p2cread and p2cwrite:
  979.                 os.close(p2cread)
  980.             if c2pwrite and c2pread:
  981.                 os.close(c2pwrite)
  982.             if errwrite and errread:
  983.                 os.close(errwrite)
  984.  
  985.             # Wait for exec to fail or succeed; possibly raising exception
  986.             data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
  987.             os.close(errpipe_read)
  988.             if data != "":
  989.                 os.waitpid(self.pid, 0)
  990.                 child_exception = pickle.loads(data)
  991.                 raise child_exception
  992.  
  993.  
  994.         def _handle_exitstatus(self, sts):
  995.             if os.WIFSIGNALED(sts):
  996.                 self.returncode = -os.WTERMSIG(sts)
  997.             elif os.WIFEXITED(sts):
  998.                 self.returncode = os.WEXITSTATUS(sts)
  999.             else:
  1000.                 # Should never happen
  1001.                 raise RuntimeError("Unknown child exit status!")
  1002.  
  1003.             _active.remove(self)
  1004.  
  1005.  
  1006.         def poll(self):
  1007.             """Check if child process has terminated.  Returns returncode
  1008.             attribute."""
  1009.             if self.returncode == None:
  1010.                 try:
  1011.                     pid, sts = os.waitpid(self.pid, os.WNOHANG)
  1012.                     if pid == self.pid:
  1013.                         self._handle_exitstatus(sts)
  1014.                 except os.error:
  1015.                     pass
  1016.             return self.returncode
  1017.  
  1018.  
  1019.         def wait(self):
  1020.             """Wait for child process to terminate.  Returns returncode
  1021.             attribute."""
  1022.             if self.returncode == None:
  1023.                 pid, sts = os.waitpid(self.pid, 0)
  1024.                 self._handle_exitstatus(sts)
  1025.             return self.returncode
  1026.  
  1027.  
  1028.         def communicate(self, input=None):
  1029.             """Interact with process: Send data to stdin.  Read data from
  1030.             stdout and stderr, until end-of-file is reached.  Wait for
  1031.             process to terminate.  The optional input argument should be a
  1032.             string to be sent to the child process, or None, if no data
  1033.             should be sent to the child.
  1034.  
  1035.             communicate() returns a tuple (stdout, stderr)."""
  1036.             read_set = []
  1037.             write_set = []
  1038.             stdout = None # Return
  1039.             stderr = None # Return
  1040.  
  1041.             if self.stdin:
  1042.                 # Flush stdio buffer.  This might block, if the user has
  1043.                 # been writing to .stdin in an uncontrolled fashion.
  1044.                 self.stdin.flush()
  1045.                 if input:
  1046.                     write_set.append(self.stdin)
  1047.                 else:
  1048.                     self.stdin.close()
  1049.             if self.stdout:
  1050.                 read_set.append(self.stdout)
  1051.                 stdout = []
  1052.             if self.stderr:
  1053.                 read_set.append(self.stderr)
  1054.                 stderr = []
  1055.  
  1056.             while read_set or write_set:
  1057.                 rlist, wlist, xlist = select.select(read_set, write_set, [])
  1058.  
  1059.                 if self.stdin in wlist:
  1060.                     # When select has indicated that the file is writable,
  1061.                     # we can write up to PIPE_BUF bytes without risk
  1062.                     # blocking.  POSIX defines PIPE_BUF >= 512
  1063.                     bytes_written = os.write(self.stdin.fileno(), input[:512])
  1064.                     input = input[bytes_written:]
  1065.                     if not input:
  1066.                         self.stdin.close()
  1067.                         write_set.remove(self.stdin)
  1068.  
  1069.                 if self.stdout in rlist:
  1070.                     data = os.read(self.stdout.fileno(), 1024)
  1071.                     if data == "":
  1072.                         self.stdout.close()
  1073.                         read_set.remove(self.stdout)
  1074.                     stdout.append(data)
  1075.  
  1076.                 if self.stderr in rlist:
  1077.                     data = os.read(self.stderr.fileno(), 1024)
  1078.                     if data == "":
  1079.                         self.stderr.close()
  1080.                         read_set.remove(self.stderr)
  1081.                     stderr.append(data)
  1082.  
  1083.             # All data exchanged.  Translate lists into strings.
  1084.             if stdout != None:
  1085.                 stdout = ''.join(stdout)
  1086.             if stderr != None:
  1087.                 stderr = ''.join(stderr)
  1088.  
  1089.             # Translate newlines, if requested.  We cannot let the file
  1090.             # object do the translation: It is based on stdio, which is
  1091.             # impossible to combine with select (unless forcing no
  1092.             # buffering).
  1093.             if self.universal_newlines and hasattr(open, 'newlines'):
  1094.                 if stdout:
  1095.                     stdout = self._translate_newlines(stdout)
  1096.                 if stderr:
  1097.                     stderr = self._translate_newlines(stderr)
  1098.  
  1099.             self.wait()
  1100.             return (stdout, stderr)
  1101.  
  1102.  
  1103. def _demo_posix():
  1104.     #
  1105.     # Example 1: Simple redirection: Get process list
  1106.     #
  1107.     plist = Popen(["ps"], stdout=PIPE).communicate()[0]
  1108.     print "Process list:"
  1109.     print plist
  1110.  
  1111.     #
  1112.     # Example 2: Change uid before executing child
  1113.     #
  1114.     if os.getuid() == 0:
  1115.         p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
  1116.         p.wait()
  1117.  
  1118.     #
  1119.     # Example 3: Connecting several subprocesses
  1120.     #
  1121.     print "Looking for 'hda'..."
  1122.     p1 = Popen(["dmesg"], stdout=PIPE)
  1123.     p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
  1124.     print repr(p2.communicate()[0])
  1125.  
  1126.     #
  1127.     # Example 4: Catch execution error
  1128.     #
  1129.     print
  1130.     print "Trying a weird file..."
  1131.     try:
  1132.         print Popen(["/this/path/does/not/exist"]).communicate()
  1133.     except OSError, e:
  1134.         if e.errno == errno.ENOENT:
  1135.             print "The file didn't exist.  I thought so..."
  1136.             print "Child traceback:"
  1137.             print e.child_traceback
  1138.         else:
  1139.             print "Error", e.errno
  1140.     else:
  1141.         print >>sys.stderr, "Gosh.  No error."
  1142.  
  1143.  
  1144. def _demo_windows():
  1145.     #
  1146.     # Example 1: Connecting several subprocesses
  1147.     #
  1148.     print "Looking for 'PROMPT' in set output..."
  1149.     p1 = Popen("set", stdout=PIPE, shell=True)
  1150.     p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
  1151.     print repr(p2.communicate()[0])
  1152.  
  1153.     #
  1154.     # Example 2: Simple execution of program
  1155.     #
  1156.     print "Executing calc..."
  1157.     p = Popen("calc")
  1158.     p.wait()
  1159.  
  1160.  
  1161. if __name__ == "__main__":
  1162.     if mswindows:
  1163.         _demo_windows()
  1164.     else:
  1165.         _demo_posix()
  1166.